//1.什么是接口类型?
// 和number,string,boolean,enum这些数据类型一样,接口也是一种类型，也是用来约束使用者的
// 举例
let obj= {
    firstname:"刘",
    lastname:"德华",
    address:"湖南",
    phonenumber:13873342501
};
//需求:要求定义一个say函数输出一个人完整的姓名,这个人的姓必须是字符串,这个人的名也必须是一个字符
//这里可以看到上面obj中lastname保存的是一个数字类型的数据,怎么对传入对象中的属性作限制呢?我们可以定义一个接口来限制对象中属性保存的值
function say({firstname,lastname}:FullName):void{  //在函数的参数这里限制传入的对象中的属性所保存的数据类型,如果传入的数据类型不符和接口所定义的规范那么就会报错
    console.log(`我是${firstname}${lastname}`);
}
//这一步定义接口
interface FullName{
    firstname:string,
    lastname:string,
    age?:15,
    [propName:string]:any //使用索引签名当该接口约束形参或者变量时,赋予的值超过也不会报错,这里使用索引签名约束超多接口限制赋予的值得类型,例如key值只能为string,value值可以为任何类型.
        //假如我约束value为number类型那么被改接口约束得变量或参数,额外赋予得值得value就必须为number,也就是我们obj中address和phonenumber是额外赋予得值,但是属性address得value值为字符所以就会报错
}
// 当函数传入的参数为对象时可以使用接口来约束该对象参数中的属性的类型,但是注意如果使用接口来限定了变量或者形参,那么在给变量赋值或者传入形参时
//赋予的值或者传入的实参必须要和接口中限定的一模一样,接口中的属性名和数量都必须一模一样否则会报错

//但是在企业开发中有时候传入的形参有时候多一个有时候少一个怎么办呢,这个时候在定义接口的时候,给接口中定义的数据添加一个问好代表可选.当使用该接口限定变量或形参时,接口中的可选属性可有可无.
//例如我们上面定义接口时定义了一个age可选属性,并用改接口限制了say函数传入的形参,但是实际传入的实参obj中并没有定义age属性但是也不会报错,这就是可选属性的作用.在赋予值得时候可以忽略
//那么当我们传入的实参对象中属性多了一个怎么办呢,可以在定义接口得时候使用索引签名就行了,例如上面哪个接口就使用了索引签名,而我们传入的实参对象中的属性却超出了接口的数量约束
say(obj)



//函数接口
//我们除了可以通过接口限定对象以外,我们还可以使用接口来限定函数
//例如我们下面定义一个接口
interface SumInterface{
    (a:number,b:number):number //该接口约束得变量必须是一个函数且该函数必须要传入两个number类型的参数并返回一个number类型的值
}
let sum:SumInterface=function(a:number,b:number):number{
        return 123+a+b;
}
